package com.xuexi.mashibing;

/**
 * wait 与 sleep 的区别
 * 1、wait属于object，sleep是thread的静态类
 * 2、wait使线程进入waiting状态，需要手动唤醒notify、notifyAll；sleep使线程进入timed_waiting状态，到休眠时间结束自动唤醒
 * 3、wait释放锁资源，sleep不释放锁资源
 * 4、wait搭配synchronized使用（底层ObjectMonitor），sleep可以单独使用
 */
public class WaitLock {

    private boolean taskCompleted = false;

    // 使用 synchronized 关键字修饰
    private synchronized void performTask() {
        // 判断任务是否完成
        while (!taskCompleted) {
            try {
                System.out.println("任务执行中...");
                // 等待通知
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("任务完成，继续执行后续操作...");
    }

    // 使用 synchronized 关键字修饰
    private synchronized void notifyTaskCompletion() {
        taskCompleted = true;
        // 唤醒等待的线程
        notify();
    }

    public static void main(String[] args) {
        WaitLock example = new WaitLock();
        WaitLock example1 = new WaitLock();
        WaitLock example2 = new WaitLock();

        // 创建新线程执行任务
        new Thread(example::performTask).start();
        new Thread(example1::performTask).start();
        new Thread(example2::performTask).start();

        // 主线程模拟任务完成
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 通知任务完成
        example.notifyTaskCompletion();
    }
}
